package com.zhongge.arrayqueue;

/**
 * @ClassName MyCircularQueue
 * @Description TODO 数组实现循环队列
 * @Author 笨忠
 * @Date 2025/8/26 10:13
 * @Version 1.0
 */
public class MyCircularQueue {
    //队头指针
    private int front;//始终指向队列中第一个有效元素(本身)

    //队尾指针
    private int rear;//始终指向的是队列中最后一个有效元素的下一位

    //数组模拟队列
    private int[] array;


    public MyCircularQueue(int k) {
        array = new int[k];
    }

    //各种方法。。。

    /**
     * 入队
     * @param value 待入队的值
     * @return true-入队成功 false-入队失败
     */
    public boolean enQueue(int value) {
        //1.判满
        if (isFull()) {
            return false;
        }
        //程序走到这说明队列没有满
        //开始入队
        //2.将值放入到rear所指的位置
        array[rear] = value;
        //3.然后rear后移
        rear = (rear + 1) % array.length;
        return true;
    }

    /**
     * 出队
     * @return 出队元素值  -1代表空(将来使用异常)
     */
    public int deQueue() throws ElemEmptyException{
        //1.判空
        if (isEmpty()) {
            throw new ElemEmptyException("队列为空");
        }
        //2.将front处的值存起来(后面用于返回)
        int val = array[front];
        //front后移
        front = (front + 1) % array.length;
        return val;
    }

    /**
     * 获取队头元素
     * @return 队头元素的值
     */
    public int Front() throws ElemEmptyException {
        //1.判空
        if (isEmpty()) {
            throw new ElemEmptyException("队列为空");
        }
        return array[front];
    }

    /**
     * 获取队尾元素
     * @return 队尾元素的值
     */
    public int Rear() throws ElemEmptyException {
        //1.判空
        if (isEmpty()) {
            throw new ElemEmptyException("队列为空");
        }
        return (rear == 0) ? array[array.length - 1] : array[rear - 1];
    }

    /**
     * 判空
     * @return true-队列为空  false-队列不空
     */
    public boolean isEmpty() {
        return rear == front;
    }

    /**
     * 判满
     * @return true-队列满  false-队列不满
     */
    public boolean isFull() {
        if (((rear + 1) % array.length) == front) {
            return true;
        }
        return false;
    }
}
